<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>promise</title>
</head>
<body>
<script>
    //自己的理解：
    //在一个函数正执行着，他需要一个异步，去判断一下，首先他先创建一个promise对象，然后promise有个匿名函数，有两个参数，
    // 一个resolved，一个rejected，一个是成功了执行，一个是失败了执行，然后你就去定义什么时候去执行成功的，什么时候是失败的
    //然后在下面你在去调用这个函数时，你用then去执行它，默认第一个为成功的执行代码，第二个传进来的函数时失败了的参数。第二个参数
    //可有可无  then之后反悔的还是个promise对象，所以可以用链式。
       var flag=1;
    var promise=new Promise(function(resolve,reject){
        console.log('开始了啊o');
        setTimeout(()=>flag=0,1000)
        if(flag){
            resolve(value);
        }else{
            console.log('出错了');
            reject(error);
        }
    });
    promise.then(function(){
        console.log(flag);
    },function(){
        flag=!flag;
        console.log(flag);
        throw 'error'
    }).then(function(){
        console.log('当前状态：'+flag);
    }).catch(function(){
        console.log('error flag:'+flag);
    });
    //promise.prototype.catch()
    //相当于.then(null,rejection);用于指定发生错误时的回调函数

    //promise.race()
    //和promise.all()一样的都市多个promise实例包装成一个新的promise实例，但又有点不同，是状态改变上面的不同
    var p=Promise.race([
        fetch('./20180323'),
        new Promise(function(resolve,reject){
            setTimeout(()=>reject(new Error('jdkfj')),1000)
        })
    ]);
    p.then(re=>console.log(re))
    .catch(error=>console.log(error))

    //附加的方法：done保证抛出任何可能出现的错误总处于回调链的尾端

    //finally（）  用于指定不管promise对象状态如何都会执行的一个操作，他与done方法的最大区别在于，他接受一个
    //普通回调函数作为参数,该函数不管怎么样都必须执行

    ///应用：
    //加载图片：
    const preloadImage=function(path){
        return new Promise(function(resolve,reject){
            var image=new Image();
            image.onload=resolve;
            image.onerror=reject;
            image.src=path;
        })
    }
    preloadImage('ijasd')
        .then(function(){
            console.log('ok')
        })
        .catch(function(){
            console.log('fail');
        });
    //generator函数与他结合

</script>
</body>
</html>